The Lorenz system is a system of ordinary differential equations first studied by mathematician and meteorologist Edward Lorenz. It is notable for having Chaos theory solutions for certain parameter values and initial conditions. In particular, the Lorenz attractor is a set of chaotic solutions of the Lorenz system. The term "butterfly effect" in popular media may stem from the real-world implications of the Lorenz attractor, namely that tiny changes in initial conditions evolve to completely different trajectories. This underscores that chaotic systems can be completely Determinism and yet still be inherently impractical or even impossible to predict over longer periods of time. For example, even the small flap of a butterfly's wings could set the earth's atmosphere on a vastly different trajectory, in which for example a hurricane occurs where it otherwise would have not (see Saddle points). The shape of the Lorenz attractor itself, when plotted in phase space, may also be seen to resemble a butterfly.
The equations relate the properties of a two-dimensional fluid layer uniformly warmed from below and cooled from above. In particular, the equations describe the rate of change of three quantities with respect to time: is proportional to the rate of convection, to the horizontal temperature variation, and to the vertical temperature variation. The constants , , and are system parameters proportional to the Prandtl number, Rayleigh number, and certain physical dimensions of the layer itself.
The Lorenz equations can arise in simplified models for , dynamos, , brushless , , chemical reactions and forward osmosis. Interestingly, the same Lorenz equations were also derived in 1963 by Sauermann and Haken for a single-mode laser. In 1975, Haken realized that their equations derived in 1963 were mathematically equivalent to the original Lorenz equations. Haken's paper thus started a new field called laser chaos or optical chaos. The Lorenz equations are often called Lorenz-Haken equations in optical literature. Later on, it was also shown the complex version of Lorenz equations also had laser equivalent ones. The Lorenz equations are also the governing equations in Fourier space for the Malkus waterwheel. The Malkus waterwheel exhibits chaotic motion where instead of spinning in one direction at a constant speed, its rotation will speed up, slow down, stop, change directions, and oscillate back and forth between combinations of such behaviors in an unpredictable manner.
From a technical standpoint, the Lorenz system is nonlinearity, aperiodic, three-dimensional and deterministic. The Lorenz equations have been the subject of hundreds of research articles, and at least one book-length study.
If then there is only one equilibrium point, which is at the origin. This point corresponds to no convection. All orbits converge to the origin, which is a global attractor, when ., pp. 306+307
A pitchfork bifurcation occurs at , and for two additional critical points appear at These correspond to Steady state convection. This pair of equilibrium points is Stability theory only if
When , , and , the Lorenz system has chaotic solutions (but not all solutions are chaotic). Almost all initial points will tend to an Lorenz attractora strange attractor, a fractal, and a self-excited attractor with respect to all three equilibria. Its Hausdorff dimension is estimated from above by the Lyapunov dimension (Kaplan-Yorke dimension) as , and the correlation dimension is estimated to be . The exact Lyapunov dimension formula of the global attractor can be found analytically under classical restrictions on the parameters:
The Lorenz attractor is difficult to analyze, but the action of the differential equation on the attractor is described by a fairly simple geometric model. Proving that this is indeed the case is the fourteenth problem on the list of Smale's problems. This problem was the first one to be resolved, by Warwick Tucker in 2002.
For other values of , the system displays knotted periodic orbits. For example, with it becomes a torus knot.
A choice of the parameter has been applied to be consistent with the choice of the other parameters. See details in.
function step!(l::Lorenz)
attractor = Lorenz()
sigma = 10;
beta = 8/3;
rho = 28;
f = @(t,a) -sigma*a(1);
t,a = ode45(f,0,1); % Runge-Kutta 4th/5th order ODE solver
plot3(a(:,1),a(:,2),a(:,3))
Less verbose:
def lorenz(xyz, *, s=10, r=28, b=2.667):
dt = 0.01
num_steps = 10000
xyzs = np.empty((num_steps + 1, 3)) # Need one more for the initial values
xyzs0 = (0., 1., 1.05) # Set initial values
ax.plot(*xyzs.T, lw=0.6)
ax.set_xlabel("X Axis")
ax.set_ylabel("Y Axis")
ax.set_zlabel("Z Axis")
ax.set_title("Lorenz Attractor")
plt.show()
Lorenz <- function (t, vars, prm) {
times <- seq(from = 0, to = 100, by = 0.01)
dout <- as.data.frame(out)
dout$color <- gfill(rainbow(10), nrow(dout))
The partial differential equations modeling the system's stream function and temperature are subjected to a spectral Galerkin method: the hydrodynamic fields are expanded in Fourier series, which are then severely truncated to a single term for the stream function and two terms for the temperature. This reduces the model equations to a set of three coupled, Nonlinear system ordinary differential equations. A detailed derivation may be found, for example, in nonlinear dynamics texts from , Appendix C; , Appendix D; or Shen (2016), Supplementary Materials.
Then the proof is split in three main points that are proved and imply the existence of a strange attractor. The three points are:
To prove the first point, we notice that the cross section is cut by two arcs formed by . Tucker covers the location of these two arcs by small rectangles , the union of these rectangles gives . Now, the goal is to prove that for all points in , the flow will bring back the points in , in . To do that, we take a plan below at a distance small, then by taking the center of and using Euler method, one can estimate where the flow will bring in which gives us a new point . Then, one can estimate where the points in will be mapped in using Taylor series, this gives us a new rectangle centered on . Thus we know that all points in will be mapped in . The goal is to do this method recursively until the flow comes back to and we obtain a rectangle in such that we know that . The problem is that our estimation may become imprecise after several iterations, thus what Tucker does is to split into smaller rectangles and then apply the process recursively. Another problem is that as we are applying this algorithm, the flow becomes more 'horizontal', leading to a dramatic increase in imprecision. To prevent this, the algorithm changes the orientation of the cross sections, becoming either horizontal or vertical.
== Gallery ==
For small values of , the system is stable and evolves to one of two fixed point attractors. When , the fixed points become repulsors and the trajectory is repelled by them in a very complex way. Evolution of three initially nearby trajectories of the Lorenz system. In this animation the equation is numerically integrated using a Runge-Kutta routine — made using starting from three initial conditions (green), (blue) and (red). Produced with WxMaxima. The parameters are: , , and . Significant divergence is seen at around , beyond which the trajectories become uncorrelated. The full-sized graphic can be accessed here.
Connection to tent map
A Generalized Lorenz System
Simulations
Julia simulation
@kwdef mutable struct Lorenz
dt::Float64 = 0.02
σ::Float64 = 10
ρ::Float64 = 28
β::Float64 = 8/3
x::Float64 = 2
y::Float64 = 1
z::Float64 = 1
end
dx = l.σ * (l.y - l.x)
dy = l.x * (l.ρ - l.z) - l.y
dz = l.x * l.y - l.β * l.z
l.x += l.dt * dx
l.y += l.dt * dy
l.z += l.dt * dz
end
plt = plot3d(
1,
xlim = (-30, 30),
ylim = (-30, 30),
zlim = (0, 60),
title = "Lorenz Attractor",
marker = 2,
)
@gif for i=1:1500
step!(attractor)
push!(plt, attractor.x, attractor.y, attractor.z)
end every 10
Maple simulation
Maxima simulation
MATLAB simulation
Mathematica simulation
y'[t] == x[t] (ρ - z[t]) - y[t],
z'[t] == x[t] y[t] - β z[t]};
init = {x0 == 10, y0 == 10, z0 == 10};
pars = {σ->10, ρ->28, β->8/3};
{xs, ys, zs} =
NDSolveValue[{eq /. pars, init}, {x, y, z}, {t, 0, tend}];
ParametricPlot3D{xs[t, yst, zst}, {t, 0, tend}]
Python simulation
"""
Parameters
----------
xyz : array-like, shape (3,)
Point of interest in three-dimensional space.
s, r, b : float
Parameters defining the Lorenz attractor.
Returns
-------
xyz_dot : array, shape (3,)
Values of the Lorenz attractor's partial derivatives at *xyz*.
"""
x, y, z = xyz
x_dot = s*(y - x)
y_dot = r*x - y - x*z
z_dot = x*y - b*z
return np.array([x_dot, y_dot, z_dot])
for i in range(num_steps):
xyzs[i + 1] = xyzs[i] + lorenz(xyzs[i]) * dt
ax = plt.figure().add_subplot(projection='3d')
R simulation
prm <- list(sigma = 10, rho = 28, beta = 8/3)
varini <- c(
X = 1,
Y = 1,
Z = 1
)
with(as.list(vars), {
dX <- prm$sigma*(Y - X)
dY <- X*(prm$rho - Z) - Y
dZ <- X*Y - prm$beta*Z
return(list(c(dX, dY, dZ)))
})
}
out <- ode(y = varini, times = times, func = Lorenz,
parms = prm)
gfill <- function (repArr, long) {
rep(repArr, ceiling(long/length(repArr)))[1:long]
}
plot_ly(
data=dout, x = ~X, y = ~Y, z = ~Z,
type = 'scatter3d', mode = 'lines',
opacity = 1, line = list(width = 6, color = ~color, reverscale = FALSE)
)
SageMath simulation
def Runge_Kutta(f,v,a,b,h,n):
tlist = [a+i*h for i in range(n+1)]
y = [[0,0,0] for _ in range(n+1)]
# Taking length of f (number of equations).
m=len(f)
# Number of variables in v.
vm=len(v)
if m!=vm:
return("error, number of equations is not equal with the number of variables.")
for r in range(vm):
y[0][r]=b[r]
# making a vector and component will be a list
# main part of the algorithm
k1=[0 for _ in range(m)]
k2=[0 for _ in range(m)]
k3=[0 for _ in range(m)]
k4=[0 for _ in range(m)]
for i in range(1,n+1): # for each t_i, i=1, ... , n
# k1=h*f(t_{i-1},x_1(t_{i-1}),...,x_m(t_{i-1}))
for j in range(m): # for each f_{j+1}, j=0, ... , m-1
k1[j]=f[j].subs(t==tlist[i-1])
for r in range(vm):
k1[j]=k1[j].subs(v[r]==y[i-1][r])
k1[j]=h*k1[j]
for j in range(m): # k2=h*f(t_{i-1}+h/2,x_1(t_{i-1})+k1/2,...,x_m(t_{i-1}+k1/2))
k2[j]=f[j].subs(t==tlist[i-1]+h/2)
for r in range(vm):
k2[j]=k2[j].subs(v[r]==y[i-1][r]+k1[r]/2)
k2[j]=h*k2[j]
for j in range(m): # k3=h*f(t_{i-1}+h/2,x_1(t_{i-1})+k2/2,...,x_m(t_{i-1})+k2/2)
k3[j]=f[j].subs(t==tlist[i-1]+h/2)
for r in range(vm):
k3[j]=k3[j].subs(v[r]==y[i-1][r]+k2[r]/2)
k3[j]=h*k3[j]
for j in range(m): # k4=h*f(t_{i-1}+h,x_1(t_{i-1})+k3,...,x_m(t_{i-1})+k3)
k4[j]=f[j].subs(t==tlist[i-1]+h)
for r in range(vm):
k4[j]=k4[j].subs(v[r]==y[i-1][r]+k3[r])
k4[j]=h*k4[j]
for j in range(m): # Now x_j(t_i)=x_j(t_{i-1})+(k1+2k2+2k3+k4)/6
y[i][j]=y[i-1][j]+(k1[j]+2*k2[j]+2*k3[j]+k4[j])/6
return(tlist,y)
a=0.0 # t_0
b=0.0,.50,0.0 # x_1(t_0), ... , x_m(t_0)
t=var('t')
x = var('x', n=3, latex_name='x')
v=x[ii for ii in range(3)]
f= 10*(x1-x0),x0*(28-x2)-x1,x0*x1-(8/3)*x2;
n=1600
h=0.0125
tlist,y=Runge_Kutta(f,v,a,b,h,n)
T=point3d([y[i0,yi1,yi2] for i in range(n)], color='red')
S=line3d([y[i0,yi1,yi2] for i in range(n)], color='red')
show(T+S)
a=0.0 # t_0
b=0.0,.50,0.0 # x_1(t_0), ... , x_m(t_0)
t=var('t')
x = var('x', n=3, latex_name='x')
v=x[ii for ii in range(3)]
Lorenz= 10*(x1-x0),x0*(28-x2)-x1,x0*x1-(8/3)*x2;
n=100
h=0.1
tlist,y=Runge_Kutta(Lorenz,v,a,b,h,n)
P1=list_plot([tlist[i,yi0] for i in range(n)], plotjoined=True, color='red');
P2=list_plot([tlist[i,yi1] for i in range(n)], plotjoined=True, color='green');
P3=list_plot([tlist[i,yi2] for i in range(n)], plotjoined=True, color='yellow');
show(P1+P2+P3)
a=0.0 # t_0
b=0.0,.50,0.0 # x_1(t_0), ... , x_m(t_0)
t=var('t')
x = var('x', n=3, latex_name='x')
v=x[ii for ii in range(3)]
f= 10*(x1-x0),x0*(28-x2)-x1,x0*x1-(8/3)*x2;
n=800
h=0.025
tlist,y=Runge_Kutta(f,v,a,b,h,n)
vv=[y[i0,yi1] for i in range(n)];
T=points(vv, rgbcolor=(0.2,0.6, 0.1), pointsize=10)
S=line(vv,rgbcolor=(0.2,0.6, 0.1))
show(T+S)
a=0.0 # t_0
b=0.0,.50,0.0 # x_1(t_0), ... , x_m(t_0)
t=var('t')
x = var('x', n=3, latex_name='x')
v=x[ii for ii in range(3)]
f= 10*(x1-x0),x0*(28-x2)-x1,x0*x1-(8/3)*x2;
n=800
h=0.025
tlist,y=Runge_Kutta(f,v,a,b,h,n)
vv=[y[i0,yi2] for i in range(n)];
T=points(vv, rgbcolor=(0.2,0.6, 0.1), pointsize=10)
S=line(vv,rgbcolor=(0.2,0.6, 0.1))
show(T+S)
a=0.0 # t_0
b=0.0,.50,0.0 # x_1(t_0), ... , x_m(t_0)
t=var('t')
x = var('x', n=3, latex_name='x')
v=x[ii for ii in range(3)]
f= 10*(x1-x0),x0*(28-x2)-x1,x0*x1-(8/3)*x2;
n=800
h=0.025
tlist,y=Runge_Kutta(f,v,a,b,h,n)
vv=[y[i1,yi2] for i in range(n)];
T=points(vv, rgbcolor=(0.2,0.6, 0.1), pointsize=10)
S=line(vv,rgbcolor=(0.2,0.6, 0.1))
show(T+S)
Applications
Model for atmospheric convection
Model for the nature of chaos and order in the atmosphere
Resolution of Smale's 14th problem
See also
Notes
Further reading
External links
|
|